package com.yixiu.javabase.modules.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * 有关集合的规则，参考阿里巴巴java开发手册
 */
public class CollectionRule {

    public static void main(String[] args) {

        //testArrayList();

        testFailFast1();
    }


    public static void testArrayList() {

        List arrayList = new ArrayList<String>();
        arrayList.add("hello");
        arrayList.add("world");
        arrayList.add("world2");
        // 强制转换arrayList.subList报错 :java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList
        //ArrayList arrayList2 = (ArrayList) arrayList.subList(0,1);

        // 所有对arrayList.subList的操作，都会影响到原ArrayList上
        List list =   arrayList.subList(0,2);
        list.set(0,"haha");
        System.out.println(list.get(0));
        System.out.println(arrayList.get(0));

        // 针对原arrayList的修改，都会导致arrayList.subList遍历时的异常： java.util.ConcurrentModificationException
        // arrayList.add(0,"yaya");
        for (Object obj: list ) {
            System.out.println(obj.toString());
        }

        // 列表转数组
        String [] array = new String[arrayList.size()];
        arrayList.toArray(array);
        for (String s: array ) {
            System.out.println(s);
        }

        // 数组转列表
        List list2 = Arrays.asList(array);
        // 数组转过来的列表，不能添加元素：java.lang.UnsupportedOperationException
        //list2.add("ha");

        // http://www.importnew.com/8966.html
        // 针对栈Stack<Number>，
        // pushAll(Iterable<? extends E> src):src是生产者，向Stack生产元素，元素只要是Number的子类就行
        // popAll(Collection<E> dst) : dst是消费者，将Stack的元素消费到dst中，集合类型只要是Number的父类就行



        List<String> list3 = new ArrayList<String>();
        list3.add("1");
        list3.add("2");
        // 删除list的元素，使用Iterator
        Iterator<String> iterator = list3.iterator();
        while (iterator.hasNext()) {
            String item = iterator.next();
            if ("1".equals(item)) {
                iterator.remove();
            }
        }

        // 删除list的元素，千万不要用foreach，没用，应该用Iterator
//        for (String item : list3) {
//            if ("1".equals(item)) {
//                list.remove(item);
//            }
//        }

        for(String item : list3) {
            System.out.println(item);
        }



    }


    /**
     *  有关快速报错，查看下面的文章
     * https://blog.csdn.net/zymx14/article/details/78394464
     */
    public static void testFailFast1() {
        List<String> list = new ArrayList<String>();
        for (int i = 0 ; i < 10 ; i++ ) {
            list.add(i + "");
        }
        Iterator<String> iterator = list.iterator();
        int i = 0 ;
        while(iterator.hasNext()) {
            // 取下一个元素，将指针移动到下一个元素位置
            System.out.println(iterator.next());
            if (i == 3) {
                //在遍历list的过程中，修改list,就会发生fail-fast: java.util.ConcurrentModificationException
                //list.remove(3);
                // 正确的方式是：从iterator中移除当前元素，不会报错
                iterator.remove();
            }
            i ++;
        }

        for(String item : list) {
            System.out.println(item);
        }


    }

}
